#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include "MyString.h"
size_t MyStrlen(const char *s)
{
    size_t count = 0;
    while (*s++ != '\0')
    {
        count++;
    }
    return count;
}
// int main()
// {

//     printf("%ld\n",MyStrlen("helloworld"));
//     return 0;
// }

void MyStrcpy(char *dest, const char *src)
{
    while (*src != '\0')
    {
        *dest++ = *src++;
    }
    *dest = '\0';
}
// int main()
// {
//     const char *s = "hello";
//     char str[6] ={0};
//     MyStrcpy(str, s);
//     printf("%s\n",str);
//     return 0;
// }

void MyStrncpy(char *dest, const char *src, size_t n)
{
    while (*src != '\0' && n-- != 0)
    {
        *dest++ = *src++;
    }
    *dest = '\0';
}
// int main()
// {
//     const char *s = "hello";
//     char str[6] ={0};
//     MyStrncpy(str, s, 3);
//     printf("%s\n",str);
//     return 0;
// }

int MyStrcmp(const char *s1, const char *s2)
{
    while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
    {
        s1++;
        s2++;
    }
    return *s1 - *s2;
}
// int main()
// {
//     const char *s1 = "hello";
//     const char *s2 = "helloworld";
//     printf("%d\n",MyStrcmp(s1,s2));
//     return 0;
// }

#define Min(a, b) (a) < (b) ? a : b
int MyStrncmp(const char *s1, const char *s2, size_t n)
{
    size_t minLen = Min(Min(MyStrlen(s1), MyStrlen(s2)), n); // 得到最小长度
    if (minLen == n)
    {
        while ((*s1 == *s2) && (minLen-- != 1))
        {
            s1++;
            s2++;
        }
        return *s1 - *s2;
    }
    else
    {
        return MyStrcmp(s1, s2);
    }
}
// int main()
// {
//     const char *s1 = "hello";
//     const char *s2 = "helloworld";
//     printf("%d\n", MyStrncmp(s1, s2, 5));
//     return 0;
// }

void MyStrcat(char *dest, const char *src)
{
    MyStrcpy(dest + MyStrlen(dest), src);
}
// int main()
// {
//     const char *s = "world";
//     char str[20] = "hello";
//     MyStrcat(str, s);
//     printf("%s\n", str);
//     return 0;
// }

void MyStrncat(char *dest, const char *src, size_t n)
{
    MyStrncpy(dest + MyStrlen(dest), src, n);
}
// int main()
// {
//     const char *s = "world";
//     char str[20] = "hello";
//     MyStrncat(str, s,3);
//     printf("%s\n", str);
//     return 0;
// }

char *MyStrstr(char *dest, const char *src)
{
    size_t dlen = MyStrlen(dest);
    size_t slen = MyStrlen(src);

    for (int i = 0; i <= dlen - slen; i++)
    {
        if (MyStrncmp(dest + i, src, slen) == 0)
        {
            return dest + i;
        }
    }

    return NULL;
}
// int main()
// {
    
//     char str[20] = "helloworld";
//     const char *s = "llo";
//     char *a = MyStrstr(str, s);
//     printf("%s\n", a);
//     return 0;
// }

bool IsHaveChar(const char *s,char c)
{
    while( *s != '\0')
    {
        if(*s == c)
            return true;
        s++;
    }
    return false;
}

char *MyStrtok(char *src, const char *delim)
{
    // 上一次切割完的下一个字符串的
    static char *nextStr = NULL;
    if(src == NULL) //想要继续切割上一次的字符串
        src = nextStr;
    if(src == NULL)  //没有字符串可以继续被操作
        return NULL;

    //跳过所有的分割符
    while( *src != '\0')
    {
        //判断是否是分隔符
        if(IsHaveChar(delim, *src) == true)
        {
            src++;
        }
        else
            break;  //找到了第一个不是分隔符的位置
    }

    if(*src == '\0')
    {
        return NULL;
    }
    //src ：有效字符串的首地址
    //找下一个分隔符
    char *end = src;
    while(*end != '\0')
    {
        //是下一个分隔符
        if(IsHaveChar(delim, *end) == true)
        {
            break;
        }
        else
        {
            end++;
        }
    }
    if(*end == '\0')  //没有下一个字符串可以切割了
    {
        nextStr = NULL;
    }
    else
    {
        *end = '\0';
            nextStr = end + 1;
    }
    return src;
}
int main()
{
    char str[] = "zhangsan,lisi.wangwu";
    char *s = MyStrtok(str,",.");
    while(s != NULL)
    {
        printf("%s\n",s);
        s = MyStrtok(NULL,",.");
    }
    return 0;
}